﻿Imports Commander_Wars.Spieletools
Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX
Public Class GebaeudeVulkan
    Inherits ObjektGebaeude
    Public FeuerbrockenProzent As Single = 3.75
    Public Targets As New List(Of Vector3)

    Public Sub New(ByVal neuSpieler As Integer, ByVal neuX As Integer, ByVal neuY As Integer, ByVal Spielfeld As ObjektSpielfeld)
        MyBase.New("VULKAN", neuSpieler, neuX, neuY, ObjektSpielfeld.Bodenschlacht)
        GebaeudeLaden()
        getBildID(Spielfeld)
    End Sub
    Public Sub New(ByVal neuSpieler As Integer, ByVal neuLeben As Integer, ByVal neuBesetzungszahl As Integer, ByVal neuX As Integer, ByVal neuY As Integer, ByVal Feuerzahl As Integer, ByVal Spielfeld As ObjektSpielfeld)
        MyBase.New("VULKAN", neuSpieler, neuLeben, neuBesetzungszahl, neuX, neuY, Feuerzahl, ObjektSpielfeld.Bodenschlacht)
        GebaeudeLaden()
        getBildID(Spielfeld)
    End Sub

    Public Sub New()
        MyBase.New("", -1, -1, -1, ObjektSpielfeld.Bodenschlacht)
        Gebaeudename = "Vulkan"
        getFonds = False
        Deckung = 0
        Bestzunge = -1
        Schaden = 5
        Reichweite = 20
        Rechteck.Height = Hauptmenue.Feldbreite * 4
        Rechteck.Width = Hauptmenue.Feldbreite * 4
        Angriff = Angriffe.Vulkan
        Leben = -1
        Feuerbereite = -1
        Feuerladung = -1
        RotationsZenturm = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite * 5 / 2)
        WirdZu = "EBENE+SCHROTT"
        Verweisgebaeude = New Integer(,) {{-1, -2}, {0, -2}, {1, -2}, {2, -2}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {-1, 0}, {1, 0}, {2, 0}, {-1, 1}, {0, 1}, {1, 1}, {2, 1}}
    End Sub

    Private Sub GebaeudeLaden()
        Gebaeudename = "Vulkan"
        getFonds = False
        Deckung = 0
        Bestzunge = -1
        Schaden = 5
        Reichweite = 20
        Rechteck.Height = Hauptmenue.Feldbreite * 4
        Rechteck.Width = Hauptmenue.Feldbreite * 4
        Angriff = Angriffe.Vulkan
        Leben = -1
        Feuerbereite = -1
        Feuerladung = -1
        RotationsZenturm = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite * 5 / 2)
        WirdZu = "EBENE+SCHROTT"
        Verweisgebaeude = New Integer(,) {{-1, -2}, {0, -2}, {1, -2}, {2, -2}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {-1, 0}, {1, 0}, {2, 0}, {-1, 1}, {0, 1}, {1, 1}, {2, 1}}
        If Rechteck.X > 0 And Rechteck.Y > 1 Then
            For I = 0 To Verweisgebaeude.GetLength(0) - 1
                If Not Objektverwalter.Spielfeld Is Nothing Then
                    Objektverwalter.Spielfeld.Landschaften(Rechteck.X + Verweisgebaeude(I, 0), Rechteck.Y + Verweisgebaeude(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude = New GebaeudeVerweis(Spieler, Rechteck.X, Rechteck.Y, ObjektSpielfeld.Bodenschlacht)
                End If
            Next
        End If
    End Sub
    Public Overrides Sub Feuer(ByVal X As Integer, ByVal Y As Integer)

        'Nur der Host-Computer steuert den Vulkan
        If Hauptmenue.Connection.Connected = True And Hauptmenue.Connection.Hosten = False Then Exit Sub
        Dim GetroffeneZiele As New Stack(Of Point)
        If Targets.Count = 0 Then
            X = 0
            Y = 0
            Dim Zaehler As Integer = 0
            Dim Ziele As Integer(,) = Kreisfunktion(Reichweite)

            Dim ZielFelder As New List(Of Point)
            For X = -Reichweite To Reichweite
                For Y = -Reichweite To Reichweite
                    If Ziele(X + Reichweite, Y + Reichweite) >= 0 Then
                        If Objektverwalter.Spielfeld.OnMap(Rechteck.X + X, Rechteck.Y + Y) Then
                            If X = -1 And Not Y = 0 And Not Y = -1 And Not Y = 1 And Not Y = 2 Then
                                ZielFelder.Add(New Point(Rechteck.X + X, Rechteck.Y + Y))
                            ElseIf X = 0 And Not Y = 0 And Not Y = -1 And Not Y = 1 And Not Y = 2 Then
                                ZielFelder.Add(New Point(Rechteck.X + X, Rechteck.Y + Y))
                            ElseIf X = 1 And Not Y = 0 And Not Y = -1 And Not Y = 1 And Not Y = 2 Then
                                ZielFelder.Add(New Point(Rechteck.X + X, Rechteck.Y + Y))
                            ElseIf X = 2 And Not Y = 0 And Not Y = -1 And Not Y = 1 And Not Y = 2 Then
                                ZielFelder.Add(New Point(Rechteck.X + X, Rechteck.Y + Y))
                            ElseIf X <> 0 And X <> -1 And X <> 1 And X <> 2 Then
                                ZielFelder.Add(New Point(Rechteck.X + X, Rechteck.Y + Y))
                            End If
                        End If
                    End If
                Next
            Next
            Dim Feuerbrocken As Integer = ZielFelder.Count * FeuerbrockenProzent / 100
            If Feuerbrocken < 1 Then Feuerbrocken = 1
            Dim I As Integer = 1
            While I <= Feuerbrocken And ZielFelder.Count > 0
                Dim Ziel As Integer = Zufallszahl(0, ZielFelder.Count - 1)
                While GetroffeneZiele.Contains(ZielFelder(Ziel))
                    Ziel = Zufallszahl(0, ZielFelder.Count - 1)
                End While
                GetroffeneZiele.Push(ZielFelder(Ziel))
                ZielFelder.RemoveAt(Ziel)
                I += 1
            End While
        Else 'Wir haben ein Vorprogrammiertes Angriffsmuster.
            Dim ZahlAngriffMuster As Integer = 0
            Dim ErfassteTage() As Integer = {}
            For I = 0 To Targets.Count - 1
                If ErfassteTage.Contains(Targets(I).Z) = False Then
                    Array.Resize(ErfassteTage, ErfassteTage.Length + 1)
                    ErfassteTage(ErfassteTage.Length - 1) = Targets(I).Z
                    ZahlAngriffMuster += 1
                End If
            Next
            Dim R As Integer = -1
            For I = 0 To Targets.Count - 1
                Math.DivRem(Objektverwalter.Spielfeld.Runde - CInt(Targets(I).Z), ZahlAngriffMuster, R)
                If R = 0 Then

                    GetroffeneZiele.Push(New Point(Targets(I).X, Targets(I).Y))
                End If
            Next
        End If
        BackbufferSpiel.AddAnimation("VulkanAusbruch", 10, New Point(Rechteck.X, Rechteck.Y), True, ObjektSpielfeld.Bodenschlacht)
        Dim WarteFrame As Integer = 34
        For I = 0 To GetroffeneZiele.Count - 1
            DoDamage(GetroffeneZiele(I).X, GetroffeneZiele(I).Y)
            BackbufferSpiel.AddAnimation("VulkanEinschlag", WarteFrame, GetroffeneZiele(I), True, ObjektSpielfeld.Bodenschlacht)
            WarteFrame += 3
        Next

        'Wir lassen den Vulkan bei allen Spielern Feuern
        Hauptmenue.NetzBefehlVulkanFeuer(Rechteck.X, Rechteck.Y, GetroffeneZiele.ToArray)

        Objektverwalter.Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
    End Sub
    Public Overloads Sub Feuer(ByVal GetroffeneZiele() As Point)
        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("A Volcan is firing some of his Lava.")
        End If
        BackbufferSpiel.AddAnimation("VulkanAusbruch", 10, New Point(Rechteck.X, Rechteck.Y), True, ObjektSpielfeld.Bodenschlacht)
        Dim WarteFrame As Integer = 34
        For I = 0 To GetroffeneZiele.Length - 1
            DoDamage(GetroffeneZiele(I).X, GetroffeneZiele(I).Y)
            BackbufferSpiel.AddAnimation("VulkanEinschlag", WarteFrame, GetroffeneZiele(I), True, ObjektSpielfeld.Bodenschlacht)
            WarteFrame += 3
        Next
        Objektverwalter.Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
    End Sub
    Public Overrides Sub FeuerradiusAnzeigen()
        KreisAnzeigen("Rot")
        MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Einheitausgewaehlt.wav", False)
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.FeuerradiusAnzeigen
    End Sub
    Public Overrides Sub DOSpielFrame()
        'do nothing
    End Sub
    Public Overrides Function GetLandschaftsuntergrund() As String()
        Return New String() {"EBENE", "SCHNEE", "WUESTE", "EBENE+SCHROTT"}
    End Function
    Private Function KannZielSein(ByVal X As Integer, ByVal Y As Integer, ByVal ErfassteZiele() As Point, ByVal Kreis As Integer(,)) As Boolean
        If Objektverwalter.Spielfeld.OnMap(X + Reichweite, Y + Reichweite) Then
            If Kreis(X + Reichweite, Y + Reichweite) > 0 Then
                For I = 0 To ErfassteZiele.Length - 1
                    If ErfassteZiele(I).X = X And ErfassteZiele(I).Y = Y Then
                        Return False
                    End If
                Next
                Return True
            End If
        End If
        Return False
    End Function
    Public Overrides Function GetAngriffsFelder() As System.Drawing.Point()
        Return GetKreisFelder()
    End Function
End Class
